package util

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

// @Title  util
// @Description  工具函数
// @Author  chen（陈锴）
// @Update  chen（陈锴）  2023-12-23

// @Title GetTime
// @Description  从行中获取时间数据
// @Author  chen（陈锴）
// @Update  chen（陈锴）  2023-12-23
// @return start int, end int, err error
func GetTime(line string) (start int, end int, err error) {
	strList := strings.Split(line, " --> ")

	// 划分结果错误
	if len(strList) != 2 {
		err = errors.New("时间格式错误，缺少 --> 或 --> 前后时间格式错误")
		return
	}

	start, err = Time(strList[0])
	if err != nil {
		return
	}

	end, err = Time(strList[1])
	if err != nil {
		return
	}

	if end < start {
		err = errors.New("结束时间小于开始时间")
		return
	}
	return
}

// @Title Time
// @Description  从时间串中获取时间数据
// @Author  chen（陈锴）
// @Update  chen（陈锴）  2023-12-23
// @return time int, err error
func Time(line string) (time int, err error) {
	strListA := strings.Split(line, ":")

	// 划分后长度错误
	if len(strListA) != 3 {
		err = errors.New("时间数据格式错误，: 数量错误或 : 前后数据格式错误")
		return
	}

	// 处理小时
	if len(strListA[0]) != 2 {
		err = errors.New("小时数据格式错误")
		return
	}

	// 小时格式
	hour, err := strconv.Atoi(strListA[0])
	if err != nil {
		err = errors.New("小时数据格式错误")
		return
	}

	// 小时阈值
	if hour > 60 {
		err = errors.New("小时数据超过阈值: 60")
		return
	}

	// 处理分钟
	if len(strListA[1]) != 2 {
		err = errors.New("分钟数据格式错误")
		return
	}

	// 分钟格式
	minute, err := strconv.Atoi(strListA[1])
	if err != nil {
		err = errors.New("分钟数据格式错误")
		return
	}

	// 分钟阈值
	if minute > 60 {
		err = errors.New("分钟数据超过阈值: 60")
		return
	}

	// 划分秒与毫秒
	strListB := strings.Split(strListA[2], ",")

	// 划分后长度错误
	if len(strListB) != 2 {
		err = errors.New("时间数据格式错误，, 数量错误或, 前后数据格式错误")
		return
	}

	// 处理秒
	if len(strListB[0]) != 2 {
		err = errors.New("秒数据格式错误")
		return
	}

	// 秒格式
	second, err := strconv.Atoi(strListB[0])
	if err != nil {
		err = errors.New("秒数据格式错误")
		return
	}

	// 秒阈值
	if second > 60 {
		err = errors.New("秒数据超过阈值: 60")
		return
	}

	// 处理毫秒
	if len(strListB[1]) != 3 {
		err = errors.New("毫秒数据格式错误")
		return
	}

	// 毫秒格式
	msecond, err := strconv.Atoi(strListB[1])
	if err != nil {
		err = errors.New("毫秒数据格式错误")
		return
	}

	// 毫秒阈值
	if msecond > 999 {
		err = errors.New("毫秒数据超过阈值: 999")
		return
	}

	time = hour * 3600 * 1000 + minute * 60 * 1000 + second * 1000 + msecond
	return
}

// @Title TimetoStr
// @Description  时间数据转换为时间串
// @Author  chen（陈锴）
// @Update  chen（陈锴）  2023-12-23
// @return str string
func TimetoStr(time int) (str string) {
	msecond := fmt.Sprintf("%03d", time % 1000)
	time /= 1000
	second := fmt.Sprintf("%02d", time % 60)
	time /= 60
	minute := fmt.Sprintf("%02d", time % 60)
	time /= 60
	hour := fmt.Sprintf("%02d", time % 60)

	str = hour + ":" + minute + ":" + second + "," + msecond
	return
}